package com.lollipop.programming;

/**
 * @Author Lollipop
 * @Date 2025/4/7 11:03
 * @Description 单向链表反转
 */
public class ListNodeReverse {
    public static void main(String[] args) {
        // 创建链表 1 -> 2 -> 3 -> 4 -> 5
        ListNode head = new ListNode(1);
        head.next = new ListNode(2);
        head.next.next = new ListNode(3);
        head.next.next.next = new ListNode(4);
        head.next.next.next.next = new ListNode(5);
        // 反转链表
        ListNode reversedHead = reverseList(head);
        // 打印反转后的链表
        while (reversedHead != null) {
            System.out.print(reversedHead.val + " ");
            reversedHead = reversedHead.next;
        }
    }

    private static ListNode reverseList(ListNode head) {
        // 初始化前一个节点为 null
        ListNode prev = null;
        // 初始化当前节点为头节点
        ListNode curr = head;
        // 遍历链表，直到当前节点为 null
        while (curr != null) {
            // 保存当前节点的下一个节点
            ListNode next = curr.next;
            // 将当前节点的 next 指针指向前一个节点
            curr.next = prev;
            // 更新前一个节点为当前节点
            prev = curr;
            // 更新当前节点为下一个节点
            curr = next;
        }
        // 返回反转后的头节点
        return prev;
    }

    private static class ListNode {
        int val;
        ListNode next;

        ListNode(int val) {
            this.val = val;
        }
    }
}
